#include "DictEngin.h"

// #include <exception>

#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
#include <QStringDecoder>  // Qt6 官方推荐
#else
#include <QTextCodec>  // Qt5 老接口
#endif

// 把 GBK 字节流 → QString（Qt5/6 通用）
inline QString fromGbk(const std::string& gbk) {
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
    // Qt6：QStringDecoder 比 QTextCodec 快，且无需 Core5Compat 也能工作
    static QStringDecoder decoder("GBK");  // 线程安全，可复用
    return decoder.decode(
        QByteArray::fromRawData(gbk.data(), static_cast<int>(gbk.size())));
#else
    // Qt5：QTextCodec
    QTextCodec* codec = QTextCodec::codecForName("GBK");
    return codec ? codec->toUnicode(gbk.c_str(), gbk.size())
                 : QString::fromLatin1(gbk.c_str());  // 降级，防止 codec 缺失
#endif
}

DictEngin::DictEngin() {}
DictEngin::~DictEngin() {}
QString DictEngin::query(const QString& k) { return ""; }

//// class MdxEngin
////
MdxEngin::MdxEngin() : DictEngin() {}

MdxEngin::~MdxEngin() {}

QString MdxEngin::query(const QString& key) {
    string cocaHtml = "";
    string brack("<br><br>");
    string s;
    for (auto& dic : m_dicts) {
        if(QString::fromStdString(dic->get_title()).contains("COCA Freq")) {
            cocaHtml += dic->lookup(key.toStdString());
            cocaHtml += brack;
        }else {
            s += dic->lookup(key.toStdString());
            s += brack;
        }
    }
    // qDebug() << cocaHtml + s;
    return QString::fromStdString(cocaHtml + s);
}

QStringList MdxEngin::suggest(const QString& prefix) {
    QStringList out;
    if (!m_mdx) return out;
    try {
        // auto v = m_mdx->suggest(prefix.toStdString());
        // for (const auto& s : v) out.append(QString::fromStdString(s));
    } catch (...) {
        // ignore
    }
    return out;
}

bool MdxEngin::addDict(const QString& file) {
    QFileInfo info(file);
    if (info.isFile()) {
        if (m_dicts.contains(info.absoluteFilePath())) {
            return false;
        }
        qDebug() << "load mdx file: " << info.fileName();
        upMdict up = std::make_unique<mdx::Dictionary>(file.toStdString());
        m_dicts.insert(info.absoluteFilePath(), up);
        return true;
    } else if (info.isDir()) {
        qDebug() << "search mdx from dir";
    } else {
        qDebug() << "invalid file path";
    }
    return false;
}

bool MdxEngin::delDict(const QString& file) { return m_dicts.remove(file); }

QString MdxEngin::metaInfo(const QString& file) {
    QString info;
    if (m_dicts.contains(file)) {
        return QString::fromStdString(m_dicts[file]->get_description());
    }

    return info;
}

// void MdxEngin::updateDict(const QStringList& files) {
//     QStringList lists;
//     for (auto file : files) {
//         QFileInfo info(file);
//         if (info.isFile()) {
//             lists.append(info.absoluteFilePath());
//         }
//     }
//
//     // 之前的字典中找不到新的字典，释放掉旧的
//     for (auto file : m_files) {
//         if (!lists.contains(file)) {
//             int idx = m_files.indexOf(file);
//             m_dicts[idx].reset();
//         }
//     }
//     m_files.clear();
//
//     for (auto file : files) {
//         addDict(file);
//     }
// }

QString MdxEngin::next() {
    QString key = "";
    // if (m_items.empty()) {
    //     loadAllKeys();
    // }
    // if (m_items.empty() || m_recordCount <= 0) return "";
    // if (m_currIndex > m_recordCount) return "";
    //
    // QString key = QString::fromStdString(m_items[m_currIndex]->key_word);
    // m_currIndex++;
    // qDebug() << m_currIndex;
    return key;
}

void MdxEngin::loadAllKeys() {
    // m_items = m_mdx->keyList();
    qDebug() << "Total word: " << m_recordCount;
}
